﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
namespace F1010DB.Common
{
    public class GenerateCodeAutomatic 
    {
        public class GenerateForScoutMember : AbstractGetBridgeConnect
        {
            public string unitCode { set; get; }
            public int currentYear { set; get; }

            public int provinceCode { set; get; }
            private const string SQL_MAX_SCOUT = " SELECT TOP 1 ID FROM HDVNQTRI.DOAN_SINH_MASTER WHERE MA_DON_VI_BAN_DAU = @madonvibandau AND YEAR(INS_DATE) = @currentYear ORDER BY ID DESC";
            private const string SQL_MAX_SCOUT_CODE = " SELECT MAX(MA_DOAN_SINH) FROM HDVNQTRI.DOAN_SINH_MASTER WHERE LEFT(MA_DON_VI_BAN_DAU,4) = @matinhthanh GROUP BY MA_DOAN_SINH";
            private const string SQL_CODE = " SELECT PREFIX_CODE_SCOUT_1,PREFIX_CODE_SCOUT_2, COUNT_SCOUT_OF_PROVINCE FROM HDVNSYS.DANH_MUC_TINH_THANH WHERE MA_TINH_THANH = @matinhthanh";
            private const string UPDATE_COUNT = " UPDATE HDVNSYS.DANH_MUC_TINH_THANH SET COUNT_SCOUT_OF_PROVINCE = COUNT_SCOUT_OF_PROVINCE + 1 WHERE MA_TINH_THANH = @matinhthanh";
            private string[] sChar1 = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
            private string[] sChar2 = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
            private const int MAX_EACH_CODE = 9999 * 26;           
            private Dictionary<string, object> dictParameter = null;
            
            /// <summary>
            /// Tự động tạo mã ID theo đơn vị 
            /// Mã quản lý
            /// </summary>
            /// <returns></returns>
            public string generateForScoutID()
            {
                string tmp = string.Empty;
                DataTable dt = null;

                dictParameter = new Dictionary<string, object>();
                dictParameter.Add("@madonvibandau", unitCode);
                dictParameter.Add("@currentYear", currentYear);
                dt = dbContext.readATable(SQL_MAX_SCOUT, CommandType.Text, dictParameter);

                if (dt == null || dt.Rows.Count == 0)
                {
                    tmp = unitCode + currentYear.ToString() + "0001";
                    return tmp;
                }

                // Lấy 4 phần tử cuối cùng
                string tmp1 = dt.Rows[0][0].ToString().Substring(dt.Rows[0][0].ToString().Length - 4);
                int iMax = Int16.Parse(tmp1) + 1;

                tmp = unitCode + currentYear.ToString() + iMax.ToString("0000");

                return tmp;
            }    
            
            /// <summary>
            /// Đếm số đoàn sinh tại tỉnh thành phố để tiến hành tái tạo mã
            /// </summary>
            public void updateCountScoutMember()
            {
                dictParameter = new Dictionary<string, object>();
                dictParameter.Add("@matinhthanh", provinceCode);

                dbContext.executeNonQuery(UPDATE_COUNT, CommandType.Text, dictParameter);

            }
            /// <summary>
            /// Mã thông dụng cho đoàn sinh sử dụng
            /// </summary>
            /// <returns></returns>
            public string generateForScoutCode()
            {
                string tmp = string.Empty;

                dictParameter = new Dictionary<string, object>();
                dictParameter.Add("@matinhthanh", provinceCode);

                DataTable dtProvinceCode = dbContext.readATable(SQL_CODE, CommandType.Text, dictParameter);
                DataTable dtGetMaxMaDoanSinh = dbContext.readATable(SQL_MAX_SCOUT_CODE, CommandType.Text, dictParameter);
                DataRow dr = dtProvinceCode.Rows[0];
                
                // Phân tích chữ cái ban đầu AA010001
                string pre1 = dr[0].ToString(); // AA
                string pre2 = dr[1].ToString(); // ID = Tỉnh thành (01 - 63)
                string count = dr[2].ToString(); // Số đoàn sinh trong tỉnh thành
                int intCount = count.Equals("0") ? 0 : Int16.Parse(count); // Đổi sang số
                int p = intCount / MAX_EACH_CODE +  Array.IndexOf(sChar1, pre1.Substring(0, 1)); // Tính vị trí của ký tự thứ nhất


                if (dtGetMaxMaDoanSinh == null || dtGetMaxMaDoanSinh.Rows.Count == 0)
                {
                    tmp = pre1 + pre2 + "0001";
                    return tmp;
                }

                DataRow drCode = dtGetMaxMaDoanSinh.Rows[0];
                string code = drCode[0].ToString();
                int getMaxID = Int32.Parse(code.Substring(code.Length - 4));
                int d = 0;
                
                // Cách khoảng (9999 * 26) mới thay đổi giá trị chữ cái ban đầu
                if ( intCount / MAX_EACH_CODE > 0)
                {
                    p = p + 4;
                }

                // Xác định giá trị thứ hai
                if (getMaxID < 9999)
                {
                    getMaxID = getMaxID + 1;
                    d = getMaxID / 9999;
                }
                else
                {
                    getMaxID = 1;
                    d = 0;
                }

                string k = sChar1[p];
                string r = sChar2[d];

                tmp = k + r + pre2 + getMaxID.ToString("0000");
                return tmp;
            }
        }


    }
}
